/**
 * router.js路由模块
 * 职责：
 *      处理路由
 *      根据不同的请求方法+请求路径设置具体的请求函数
 * 模块职责要单一，我们划分模块的目的就是增强代码的可维护性，提升开发效率
 */

var fs = require('fs');


// Express专门提供了一种更好的方式
// 专门用来提供路由的
var express = require('express')
var User = require('./models/user')
var Category = require('./models/category')
var Product = require('./models/product')
var md5 = require('blueimp-md5')
var moment = require('moment') //引入moment
moment.locale('zh-cn')

 // 1 创建一个路由容器
 var router = express.Router();


 // 2 把路由都挂载到路由容器中
    // if(data){
    //     方式一
    //     res.status(200).send(JSON.stringify({
    //         data: ok
    //     }))
    //     方式二
    //     express 提供一个相应方式 json
    //     该方法会接受一个对象作为参数，它会帮你自动转换成字符串
    //     res.status(200).json({
    //         data: ok
    //     })
    // }
 router.post('/user/register',function (req, res) {
    var body = req.body
    // 对密码进行md5重复加密
    body.password = md5(md5(body.password))
    new User({
        "account": body.account,
        "password": body.password
    }).save(function(err){
        if(err) {
            return next(err)
        }
        res.status(200).json({
            code: 20000,
            message: '注册用户成功'
        })
    })
})
 // 账号管理接口
router.post('/user/login', function (req, res) {
    console.log(req.body)
    var body = req.body
    User.findOne({
        account: body.account,
        password: md5(md5(body.password))
    }, (err, data)=>{
        if(err) {
            return res.status(500).json({
                code: 50000,
                message: '服务器错误',
                data: err.message
            })
        }
        if(!data){
            return res.status(200).json({
                code: 20001,
                message: '账号或密码错误'
            })
        }
        res.status(200).json({
            code: 20000,
            message: '登录成功',
            data: {
                token: "admin-token",
                userId: data._id
            }
        })
    })
})
router.post('/user/logout', function (req, res) {
    res.status(200).json({
        code: 20000,
        message: '登出成功',
        data: "success"
    })
})
router.get('/user/info', function (req, res) {
    res.status(200).json({
        code: 20000,
        message: '获取个人信息成功',
        data:{
            roles:["admin"],
            introduction: "I am a super administrator",
            avatar: "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif",
            name: "Super Admin"
        }
    })
})
router.post('/user/updatePwd', function (req, res) {
    var body = req.body
    if(!body.id){
        return  res.status(200).json({
            code: 20001,
            message: '用户id不能为空',
        })
    }
    User.findOne({
        _id: body.id,
        password: md5(md5(body.password))
    }).then(data => {
        if(!data){
            return res.status(200).json({
                code: 20001,
                message: '原密码输入错误'
            })
        }
        return User.findByIdAndUpdate(body.id,{
            password: md5(md5(body.newPassword))
        })
    }).catch(err => {
        res.status(500).json({
            code: 50000,
            message: '服务器错误',
            data: err.message
        })
    }).then(data => {
        res.status(200).json({
            code: 20000,
            message: '密码修改成功'
        })
    }).catch(err => {
        res.status(500).json({
            code: 50000,
            message: '服务器错误',
            data: err.message
        })
    })
})

// 类别管理
router.post('/category/add',async function (req, res) {
    var name = req.body.name
    // var body = req.body
    try{
        if(await Category.findOne({name: name})){
            return res.status(200).json({
                code: 20001,
                message: '分类名已存在'
            })
        }
        await new Category({name: name}).save()
        res.status(200).json({
            code: 20000,
            message: '添加成功'
        })
    } catch(err) {
        res.status(500).json({
            code: 50000,
            message: '服务端错误',
            data: err.message
        })
    }
    
    // Category.findOne({name: name}, (err, ret)=>{
    //     if(ret){
    //         res.status(500).json({
    //             code: 50000,
    //             message: '操作失败',
    //             data: '分类名已存在'
    //         })
    //     } else {
    //         new Category({name: name}).save((err, data)=> {
    //             if(err){
    //                 res.status(500).json({
    //                     code: 50000,
    //                     message: '服务端错误',
    //                     data: err.message
    //                 })
    //             }
    //             res.status(200).json({
    //                 code: 20000,
    //                 message: '添加成功'
    //             })
    //         })
    //     }
    // })
})
router.get('/category/getAll', function (req, res) {
    Category.find((err, data) => {
        if(err){
            return res.status(500).json({
                code: 50000,
                message: '查询失败',
                data: err.message
            }) 
        }
        res.status(200).json({
            code: 20000,
            message: '查询成功',
            data: data
        })
    })
})
router.get('/category/delete', async (req, res)=>{
    var id = req.query.id
    if(!id){
        return  res.status(500).json({
            code: 50000,
            message: '操作失败',
            data: 'id不能为空'
        })
    }
    try{
        await Category.remove({ _id : id})
        res.status(200).json({
            code: 20000,
            message: '删除成功'
        })
    } catch (err){
        res.status(500).json({
            code: 50000,
            message: '删除失败',
            data: err.message
        })
    }
})
router.get('/category/update',async function (req, res) {
    var id = req.query.id
    var name = req.query.name
    includeId(id,res)
    try {
        // 查询是否有重复分类
        if(await Category.findOne({ name: name })) {
            return res.status(500).json({
                code: 50000,
                message: '操作失败',
                data: '分类名已存在'
            })
        }
        // 更新根据id来修改表数据
        await Category.findByIdAndUpdate(id,{ name: name, last_modified_time: moment().utcOffset(8).format('YYYY-MM-DD HH:mm:ss')})
        res.status(200).json({
            code: 20000,
            message: '更新成功'
        })
    } catch(err){
        res.status(500).json({
            code: 50000,
            message: '更新失败',
            data: err.message
        })
    }
})

// 商品管理
router.get('/product/add',async function (req, res) {
    var params = req.query
    var categoryId = req.query.categoryId
    try{
        await Category.findOne({ _id: categoryId }, (err, data) => {
            if(err){
                return res.status(500).json({
                    code: 50000,
                    message: '操作失败',
                    data: '查询不到分类ID'
                })
            }
            params.category = data.name
        })
        await Product(params).save()
        res.status(200).json({
            code: 20000,
            message: '商品添加成功'
        })
    } catch(err) {
        return res.status(500).json({
            code: 50000,
            message: '商品添加失败',
            data: err.message
        }) 
    }
})
router.get('/product/getAll', function (req, res) {
    Product.find((err, data) => {
        if(err){
            return res.status(500).json({
                code: 50000,
                message: '获取失败',
                data: err.message
            }) 
        }
        res.status(200).json({
            code: 20000,
            message: '获取成功',
            data: data
        })
    })
})
router.get('/product/delete',async function (req, res) {
    var id = req.query.id
    if(!id){
        return  res.status(200).json({
            code: 20001,
            message: '操作失败',
            data: 'id不能为空'
        })
    }
    try{
        await Product.remove({ _id : id})
        res.status(200).json({
            code: 20000,
            message: '删除成功'
        })
    } catch (err){
        res.status(500).json({
            code: 50000,
            message: '删除失败',
            data: err.message
        })
    }
})
router.get('/product/update',async function (req, res) {
    var id = req.query.id
    var params = req.query
    if(params.categoryId) {
        await Category.findOne({ _id: params.categoryId }, (err, data) => {
            if(err){
                res.status(500).json({
                    code: 50000,
                    message: '操作失败',
                    data: '查询不到该分类ID'
                })
            } else{
                params.category = data.name
            }
        })
    }
    Product.findOne({ _id: id }).then(data => {
        if(data){
            params.total = data.total
            params.stock = data.stock
            params.delivery = data.delivery
            params.last_modified_time = moment().utcOffset(8).format('YYYY-MM-DD HH:mm:ss')
            return Product.findByIdAndUpdate(id, params)
        } else {
            return res.status(500).json({
                code: 20001,
                message: '操作失败',
                data: 'id不能为空'
            })
        }
    }).catch(err => {
        res.status(500).json({
            code: 20001,
            message: '操作失败',
            data: 'id不能为空'
        })
    }).then(data => {
        res.status(200).json({
            code: 20000,
            message: '更新成功'
        })
    })
    // Product.findOne({_id: id }, (err, data) => {
    //     if(err){
    //         return res.status(500).json({
    //             code: 50000,
    //             message: '操作失败',
    //             data: '查询不到该商品'
    //         })
    //     }
    //     params.total = data.total
    //     params.stock = data.stock
    //     params.delivery = data.delivery
    // })
    // if(params.categoryId){
    //     Category.findOne({ _id: params.categoryId }, (err, data) => {
    //         if(err){
    //             return res.status(500).json({
    //                 code: 50000,
    //                 message: '操作失败',
    //                 data: '查询不到该分类ID'
    //             })
    //         } else{
    //             params.category = data.name
    //         }
    //     })
    // }
    // params.last_modified_time = moment().utcOffset(8).format('YYYY-MM-DD HH:mm:ss')
    // Product.findByIdAndUpdate(id, params, (err,data)=>{
    //     if(err){
    //         res.status(500).json({
    //             code: 50000,
    //             message: '更新失败',
    //             data: err.message
    //         })
    //     }
    //     res.status(200).json({
    //         code: 20000,
    //         message: '更新成功'
    //     })
    // })     
})
router.get('/product/putIn', async function (req, res) {
    var num = parseInt(req.query.num) || 0
    var id = req.query.id
    let obj = {}
    includeId(id, res)
    try{
        await Product.findOne({ _id: id },(err,data) => {
            if(num >= 0){
                obj = {
                    total: data.total + num,
                    stock: data.stock + num
                }
            } else {
                res.status(500).json({
                    code: 20001,
                    message: '入库数量不能为负数',
                    data: err.message
                })
            }
        })
        await Product.findByIdAndUpdate(id, obj)
        res.status(200).json({
            code: 20000,
            message: '入库成功'
        })
    } catch(err) {
        res.status(500).json({
            code: 50000,
            message: '入库失败',
            data: err.message
        })
    }
})
router.get('/product/getByCategoryId', function (req, res) {
    var id = req.query.categoryId
    if(!id){
        return  res.status(500).json({
            code: 50000,
            message: '操作失败',
            data: '分类id不能为空'
        })
    }
    // 查询所有
    Product.find({ categoryId: id  }, function(err,ret){
        if(err){
            res.status(500).json({
                code: 50000,
                message: '更新失败',
                data: err.message
            })
        }else{
            res.status(200).json({
                code: 20000,
                message: '查询所属商品成功',
                data: ret
            })
        }
    });
})
// router.get('/product/sale',async function (req, res) {
//     var num = parseInt(req.query.num) || 0
//     var id = req.query.id
//     let obj = {}
//     includeId(id, res)
//     try{
//         await Product.findOne({ _id: id },(err,data) => {
//             if(data.stock >= num) {
//                 obj = {
//                     delivery: data.delivery + num,
//                     stock: data.stock - num
//                 }
//             } else {
//                 return res.status(200).json({
//                     code: 20001,
//                     message: '库存不足'
//                 })
//             }
//         })
//         console.log(111)
//         await Product.findByIdAndUpdate(id, obj)


//         // Product.findOne({ _id: id },(err,data) => {
//         //     if(data.stock < num) {
//         //         return res.status(200).json({
//         //             code: 20001,
//         //             message: '库存不足'
//         //         })
//         //     }
//         // })
//         // await Product.findByIdAndUpdate(id, {
//         //     "$inc": {
//         //         "delivery": num,
//         //         "stock": -num
//         //     }
//         // })
//         res.status(200).json({
//             code: 20000,
//             message: '出库成功'
//         })
//     } catch(err) {
//         res.status(500).json({
//             code: 50000,
//             message: '出库失败',
//             data: err.message
//         })
//     }
// })

router.get('/product/sale',function (req, res) {
    var num = parseInt(req.query.num) || 0
    var id = req.query.id
    let obj = {}
    includeId(id, res)
    Product.findOne({ _id: id }).then(data => {
        if(data.stock < num){
            return res.status(200).json({
                code: 20001,
                message: '库存不足'
            })
        } else {
            return Product.findByIdAndUpdate(id, {
                "$inc": {
                    "delivery": num,
                    "stock": -num
                }
            })
        }
    }).catch(err => {
        res.status(500).json({
            code: 50000,
            message: '服务器错误',
            data: err.message
        })
    })
    .then(data => {
        res.status(200).json({
            code: 20000,
            message: '出库成功'
        })
    }).catch(err => {
        res.status(500).json({
            code: 50000,
            message: '出库失败',
            data: err.message
        })
    })
})
function includeId(id, res){
    if(!id){
        return  res.status(500).json({
            code: 50000,
            message: '操作失败',
            data: 'id不能为空'
        })
    }
}
// 3 把router导出
module.exports = router;